#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#define NUM 10
typedef void(*task)() ;//定义函数指针类型
task task_t[NUM];//定义一个函数指针数组
void task1()
{
  printf("这是一个执行打印日志任务！%d\n",getpid());
}
void task2()
{
  printf("这是一个执行检测网络健康状态任务！%d\n",getpid());
}
void task3()
{
  printf("这是一个绘图任务！%d\n",getpid());
}
int AddTask(task);//声明
void initTask()
{
  //初始化任务
  for(int i=0;i<NUM;i++)
  {
    task_t[i]=NULL;
  }
  AddTask(task1);//添加任务
  AddTask(task2);
  AddTask(task3);
}
int AddTask(task t)//添加任务
{
  //找到NULL位置添加函数指针
  int pos=0;
  for(;pos<NUM;pos++)
  {
    if(!task_t[pos])break;
  }
  if(pos==NUM)//判满
    return -1;
  //走到这里表示有位置
  task_t[pos]=t;
  return 0;
}
void excutetask()//执行任务
{
  for(int i=0;i<NUM;i++)
  {
    //判断是否为空
    if(!task_t[i])continue;
    task_t[i]();
  }
}
int main()
{
  pid_t id=fork();
  if(id==0)
  {
    //child
    int i=5;
    while(i--)
    {
      printf("i am a child proc ! pid :%d ppid :%d cout=%d\n",getpid(),getppid(),i);
      sleep(1);
    }
    exit(11);
  }
  else if(id<0)
  {
    perror("fork()");
    return -1;
  }
  else{
    //父进程
    int status=0;
    initTask();
    while(1)
    {
      pid_t ret_id=waitpid(id,&status,WNOHANG);
      if(ret_id>0)
      {
        if(WIFEXITED(status))
        {
          printf("程序无异常，正常跑完，pid:%d  ppid:%d exitnum:%d\n",getpid(),getppid(),WEXITSTATUS(status));
        }
        else{
          printf("程序出现异常！\n");
        }
        break;
      }
      else if(ret_id<0)
      {
        printf("等待失败！\n");
        break;
      }
      else{
        //正在等待，做点事情
        excutetask();//执行任务
        usleep(500000);
        
      }
    }
  }
}
